Modbus通信协议之四字节转浮点数

您所在的位置:网站首页 modbus word Modbus通信协议之四字节转浮点数

Modbus通信协议之四字节转浮点数

2023-08-15 07:37| 来源: 网络整理| 查看: 265

一、Modbus协议0x10功能码

0x10功能码:写多个寄存器 在这里插入图片描述 例: 请求在从机设备 17 中的 2 个寄存器中放入预置值, 起始寄存器为 40002 , 预置值为 00 0AH 和 01 02H。

Modbus主机查询 在这里插入图片描述Modbus从机回复 在这里插入图片描述 二、数据在内存中存储方式

要想把字节正确组合成浮点数,首先要了解数据在内存中是怎么存储的。存储方式有两种:

大端模式 大端模式是指数据的高字节保存在内存的低地址单元中,而数据的低字节保存在内存的高地址单元中,这样的存储模式有点类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。

小端模式 小端模式是指数据的高字节保存在内存的高地址单元中,而数据的低字节保存在内存的低地址单元中。

我使用的是STM32F4芯片,STM32的存储方式是小端模式,数据的低字节存在内存的低地址单元中,高字节存在内存的高地址单元中。如下图所示:

三、从机处理接收到的数据

我的Modbus主站是触摸屏,Modbus从站是STM32。主机输入浮点数之后,我的从机收到如下数据:

0110001500020441BC0000CRC-LCRC-H

41 BC 00 00这四个字节就是我想提取的浮点数,根据Modbus协议可知,41是高字节,00是低字节。因为STM32是小端模式,所以高字节要存放在内存中的高地址。从机把四个字节存储好之后,我再把这个存储区域的首地址强制转换为float指针类型,这样就可以提取出这个浮点数了。

/** *作用:把u8四字节数组转为float *note:低地址放float的低字节 **/ float U8_to_Float(u8* str) { float data; data = *((float*)str); return data; }

另外一种方式就是定义一个float变量,然后定义u8类型指针数组指向float变量地址,Modbus协议解析的时候只管向地址指向的存储单元填充数据,需要用浮点数的时候直接拿过来用就可以了。 这段过程可以在VS中模拟,主要分了两步实现。 仿真代码:

#include #include #include int main(void) { float freq; char recv[4] = {0x41, 0xbc, 0x00, 0x00}; //接收到的数据,高字节到低字节排列 char *Modbus_HoldReg[4]; //定义保持寄存器指针数组 //第一步:指针初始化 Modbus_HoldReg[0] = ((char*)(&freq)) + 3; //低地址指向高位 Modbus_HoldReg[1] = ((char*)(&freq)) + 2; Modbus_HoldReg[2] = ((char*)(&freq)) + 1; Modbus_HoldReg[3] = ((char*)(&freq)) + 0; //高地址指向低位 //第二步:给地址指定的内存单元赋值(对应Modbus协议中的数据解析) *Modbus_HoldReg[0] = recv[0]; *Modbus_HoldReg[1] = recv[1]; *Modbus_HoldReg[2] = recv[2]; *Modbus_HoldReg[3] = recv[3]; printf("%f\r\n", freq); return 0; }

结果图: 在这里插入图片描述

Modbus协议参考网址: http://www.openedv.com/forum.php?mod=viewthread&tid=77263&highlight=modbus



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3